﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Facade
{

    /*
     *我们来模拟一个用串口发送数据的操作，把Msg添加Crc校验后通过串口发送出去,然后把返回的数据 先验证校验，
     * 解析数据，解密等等。。。
     *不使用facade 直接用的情况可能我们要这么些
     *   SerialPort client= new SerialPort();
     *     client.Open=>client.GetCRCCheck=>client.send=>client.receive=>analydata=>....等等等等大操作
     * 这样做，，，是不是有一丢丢的麻烦
     * OK   如果哪天老板觉得串口Low，换成网口。。。。不用解析协议了。。
     * 如果以前的业务逻辑中你写了N多的  serial.send...业务层直接依赖底层的结构，那需要改serial类，analysisdata类等操作，
     * 如果在业务层，只有一个地方使用了这一坨东西，那改起来还好受一些。如果有几十个地方这样写的，那就比较累了。
     *  但是  如果 你 使用门面模式。。。。。。把这一坨东西  封装到一个中间层里面，业务逻辑只和中间层打交道，这样高层逻辑对底层
     * 没有直接的依赖，修改的时候 也只修改中间这一层，工作就会好做很多
     *
     *
     * 门面模式的好处的定义：
     * 在软件的构建过程中，某些接口直接依赖底层会带来一些问题。。。。拓展性差，修改就得加班
     * 采用添加一层稳定层来隔离变化，解决高层对低层的直接紧密依赖，是常见的解决方案=》变化并未去除，只是把变化封装到一起，
     * 变化时不至于引起太多的改动
     *这也是启蒙老师Eleven的著名  包一层思想
     */




    /// <summary>
    ///  门面模式
    /// </summary>
    public class FacadeModel
    {

        ISendable client= new Serial();  //  哪天我高兴了  我就new socket   哪天在高兴了  我还能new BeiDou

        public FacadeModel()
        {
            //可以做一些个性化操作
        }

        public bool SendMsg()
        {
            client.Open();
            return client.Send();
        }

    }

    public class Serial : ISendable
    {
        public void Open()
        {
        }

        public void Connect()
        {
        }

        public bool Send()
        {
            return true;
        }
    }

    public interface ISendable
    {
        void Open();
        bool Send();
    }

    public class AnalysisData
    {
        /*
         * 做一些解析的操纵
         */
    }
}
